package jp.anago_dev.takarush_helper.ui;

import java.util.List;

import jp.anago_dev.takarush_helper.R;
import jp.anago_dev.takarush_helper.location.IUpdateLocationCallback;
import jp.anago_dev.takarush_helper.map.CurrentLocationOverlay;
import jp.anago_dev.takarush_helper.map.MapFacade;
import jp.anago_dev.takarush_helper.ui.actionbar.ModernMapActivity;
import android.content.Intent;
import android.os.Bundle;
import android.os.RemoteException;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.ViewGroup.LayoutParams;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;

/**
 * 地図を表示する画面です。<br/>
 * 地図の表示に関連する処理のみ行います。<br/>
 * 表示以外の処理は{@link MapFacade}を介して行います。
 * 
 * @author anago_dev
 * 
 */
public class TakarushHelperActivity extends ModernMapActivity {

    /** {@link MapView} */
    private MapView mMapView;

    /** {@link MapController} */
    private MapController mMapController;

    /** {@link MapFacade} */
    private MapFacade mMapFacade;

    /** 現在地のオーバレイ */
    private CurrentLocationOverlay mCurrentLocationOverlay;

    /** 位置情報更新のコールバック */
    private final IUpdateLocationCallback mUpdateLocationCallback = new IUpdateLocationCallback.Stub() {

        @Override
        public void updateLocation(final double latitude, final double longitude, final long time, final float accuracy) throws RemoteException {

            // 地図上の現在地更新
            mCurrentLocationOverlay.setCurrentLocation(latitude, longitude);

            // TODO:テストコード
            if (accuracy != 0.0f) {
                // データ挿入
                mMapFacade.insertLocationData(latitude, longitude, time, accuracy);
            }

            GeoPoint point = new GeoPoint((int) (latitude * 1E6), (int) (longitude * 1E6));

            mMapController.animateTo(point);

        }
    };

    /**
     * @see android.support.v4.app.FragmentActivity#onCreate(android.os.Bundle)
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_top);

        // 地図取得 TODO:リリース時にAPIキーを差し替え。(アップはしないこと)
        mMapView = new MapView(this, "0J_jyFwnPfSezgQQqlX_s1LvnyiN2s_TGnW9dmw");
        addContentView(mMapView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        mMapController = mMapView.getController();

        // 地図表示設定
        mMapView.setSatellite(false);
        mMapView.setBuiltInZoomControls(true);

        mCurrentLocationOverlay = new CurrentLocationOverlay();
        List<Overlay> overlays = mMapView.getOverlays();
        overlays.add(mCurrentLocationOverlay);

        mMapController.setZoom(17);

        // 地図の窓口クラス
        mMapFacade = new MapFacade(this, mUpdateLocationCallback);

    }

    /**
     * @see com.google.android.maps.MapActivity#onResume()
     */
    @Override
    protected void onResume() {
        super.onResume();
        startLocationUpdate();
    }

    /**
     * @see com.google.android.maps.MapActivity#onPause()
     */
    @Override
    protected void onPause() {
        super.onPause();
        // 現在地取得の停止
        if (mMapFacade.isLocationServiceBinding()) {
            stopLocationUpdate();
        }
    }

    /**
     * @see jp.anago_dev.takarush_helper.ui.actionbar.ModernMapActivity#onCreateOptionsMenu(android.view.Menu)
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.menu_map, menu);

        return super.onCreateOptionsMenu(menu);
    }

    /**
     * @see com.google.android.maps.MapActivity#isRouteDisplayed()
     */
    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }

    /**
     * @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem)
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        final int itemId = item.getItemId();
        // リスト表示
        if (itemId == R.id.menu_my_location_history) {
            startActivity(new Intent(this, LocationHistoryActivity.class));
        }
        // 設定画面
        else if (itemId == R.id.menu_app_settings) {
            startActivity(new Intent(this, SettingsActivity.class));
        }

        return super.onOptionsItemSelected(item);
    }

    /**
     * 現在地更新処理を開始します。
     */
    private void startLocationUpdate() {
        // メニュー操作
        getActionBarHelper().setRefreshActionItemState(true);

        // 現在地更新の開始
        mMapFacade.startLocationUpdate();
    }

    /**
     * 現在地更新処理を停止します。
     */
    private void stopLocationUpdate() {

        // 現在地更新の停止
        mMapFacade.stopLocationUpdate();

        // メニュー操作
        getActionBarHelper().setRefreshActionItemState(false);

    }

    /**
     * TODO:通信のテストコードです。
     * 
     * @see android.app.Activity#onSearchRequested()
     */
    @Override
    public boolean onSearchRequested() {
        mMapFacade.connectionTest();
        return super.onSearchRequested();
    }

}